# -*- Mode: makefile; -*-
SUBDIRS = . @EXTERNAL_SRC_DIRS@ src
# Do not include test in the basic build.  
OTHER_DIRS = test examples
DOC_SUBDIRS = doc
# The all-local target makes sure that when different subsystems are selected
# for the configure step, the libraries are removed and the object files 
# cleaned out.  Without this step, it is possible to run make and encounter
# errors caused by out-of-date objects in the directories and in the 
# library.  We do not replace the pkglist file until the make completes,
# using the all-postamble target.
#
# Here is the logic:
#   A new configure creates lib/newconfig
#   A cleanobjsandlibs step removes that file, as well as removing the
#     libraries and object files
#   The test for whether the clean step is performed is this:
#      Create a file lib/pkglist.new
#      Compare lib/pkglist.new to lib/pkglist
#      If the same, rm lib/pkglist.new and done.
#      If different, then cleanout the libraries and object files,
#          then mv lib/pkglist.new lib/pkglist
#          
all-local:
	@if [ ! -d lib ] ; then mkdir lib ; date > lib/.mpich2created ; \
	else \
	    echo "@subsystems@" > lib/pkglist.new ; \
	    echo "@CC@ @CFLAGS@" >>lib/pkglist.new ;\
	    echo "@CXX@ @CXXFLAGS@" >> lib/pkglist.new ;\
	    echo "@F77@ @FFLAGS@" >> lib/pkglist.new ;\
	    echo "@FC@ @FCFLAGS@" >> lib/pkglist.new ;\
	    echo "@CONFIGURE_ARGUMENTS@" >>lib/pkglist.new ; \
	    echo "@LDFLAGS@" >> lib/pkglist.new ;\
	    if diff lib/pkglist lib/pkglist.new >/dev/null 2>&1 ; then \
	        rm -f lib/pkglist.new ; \
            else \
		${MAKE} cleanobjsandlibs ; \
		rm -f lib/pkglist ; \
		mv -f lib/pkglist.new lib/pkglist ; \
	    fi ; \
	fi

clean-preamble:
	${MAKE} cleanlibs

clean-postamble:
	cd examples && ${MAKE} clean

cleanobjsandlibs:
	${MAKE} clean && cd test && ${MAKE} clean
	rm -f lib/newconfig
# cleanlibs makes sure that we clean all of the library files
cleanlibs:
	rm -f lib/lib${MPILIBNAME}.a lib/lib${PMPILIBNAME}.a
	rm -f lib/lib${MPICXXLIBNAME}.a 
	rm -f lib/libf${MPILIBNAME}.a lib/lib${MPILIBNAME}f90.a
	rm -f lib/lib${MPILIBNAME}.@SHLIB_EXT@* 
	rm -f lib/lib${PMPILIBNAME}.@SHLIB_EXT@*
	rm -f lib/lib${MPICXXLIBNAME}.@SHLIB_EXT@* 
	rm -f lib/libf${MPILIBNAME}.@SHLIB_EXT@* 
	rm -f lib/lib${MPILIBNAME}f90.@SHLIB_EXT@* 
	rm -f lib/lib${MPILIBNAME}f90.*.@SHLIB_EXT@* 
	rm -f lib/lib${MPILIBNAME}.*.@SHLIB_EXT@* 
	rm -f lib/lib${PMPILIBNAME}.*.@SHLIB_EXT@*
	rm -f lib/lib${MPICXXLIBNAME}.*.@SHLIB_EXT@* 
	rm -f lib/libf${MPILIBNAME}.*.@SHLIB_EXT@* 
	rm -f lib/lib${MPILIBNAME}.la* lib/lib${PMPILIBNAME}.la*
	rm -f lib/lib${MPILIBNAME}f90.la*
	rm -f lib/lib${MPICXXLIBNAME}.la* 
	rm -f lib/libf${MPILIBNAME}.la* 

all-preamble:
	@echo "Beginning make"
	@echo "Using variables CC='@CC@' CFLAGS='@CFLAGS@' LDFLAGS='@LDFLAGS@' F77='@F77@' FFLAGS='@FFLAGS@' FC='@FC@' FCFLAGS='@FCFLAGS@' CXX='@CXX@' CXXFLAGS='@CXXFLAGS@' AR='@AR@' CPP='@CPP@' CPPFLAGS='@CPPFLAGS@'"

# Add any final extras:
#    1) Build the debugger interface if requested
# Move the "pkglist.new" file to "pkglist" on successful completion
all-postamble:
	( cd examples && $(MAKE) )
	@if [ "@BUILD_TVDLL@" = "yes" ] ; then \
	( cd src/mpi/debugger && $(MAKE) ./libtvmpich2.@SHLIB_EXT@ ) ; fi
	@if [ -s lib/pkglist.new ] ; then mv -f lib/pkglist.new lib/pkglist ; fi
	@echo "Make completed"

# The test on lib/.mpich2created lets us delete the local lib directory
# if we created it, and not otherwise
distclean-local:
	-@rm -f lib/lib${MPILIBNAME}.a lib/pkglist lib/pkglist.new
	-@rm -f lib/lib${MPILIBNAME}.@SHLIB_EXT@* lib/lib${MPILIBNAME}.la
	-@if [ -s lib/.mpich2created ] ; then rm -rf lib ; fi
	-@rm -f src/include/${MPILIBNAME}conf.h
	-@rm -f src/include/mpio.h
	-@rm -f bin/mpicc
	-@rm -f bin/mpich2version
	-@cd test && $(MAKE) distclean

# With PACKAGE set, all mpich2 and mpe2 documentation
# will go to docdir=$datarootdir/doc/$PACKAGE,
# and mpe2's exaamples_*/ and logfiles/ go to $datadir/$PACKAGE.
# Unsetting PACKAGE enables docdir=$datarootdir/doc and mpe2 data in $datadir
# User can do "make install PACKAGE=mpich2-xxx" enables
# docdir=$datarootdir/doc/mpich2-xxx and mpe2 data in $datadir/mpich2-xxx.
# PACKAGE = mpich2-@MPICH2_VERSION@

# We skip the mpid/mm directories because mm is no longer active
# mpe2 is an outside project and is tested against the default
# checks
coding-check: 
	@if [ -z $(CODINGCHECK) ] ;then \
	    echo "You must define CODINGCHECK for this target" ; \
	else \
	   echo "Checking the MPICH2 sources" ;\
	   $(CODINGCHECK) -addchecks=mpich2,funcstates,funcnests \
		-skipfiles=src/mpe2,src/mpid/mm src examples test ;\
	   if [ -d src/mpe2 ] ; then \
	        echo "Checking mpe2 sources" ;\
		$(CODINGCHECK) src/mpe2 ; \
	   fi ; \
	fi

# Set the document sources and types (empty lists still cause recursion)
# These should be empty; any source files should be described in the
# directory that contains those source files.  The presence of these
# items simply indicates that there are such documents
doc_HTML_SOURCES  =
doc_MAN_SOURCES   = 
doc_LATEX_SOURCES = 

# Add the www index pages
htmldoc-local:
	doc/mansrc/createhtmlindex

# Testing requires installation first
testing:
	(cd test && $(MAKE) testing)

profilelib_${MPILIBNAME} = ${PMPILIBNAME}
MPICXXLIBNAME = @MPICXXLIBNAME@
MPIFLIBNAME   = @MPIFLIBNAME@
MPIFWRAPNAME  = @FWRAPNAME@
install_LIB = lib/lib${MPILIBNAME}.a
optinstall_LIB = lib/lib${MPIFLIBNAME}.a
optinstall_LIB = lib/lib${MPICXXLIBNAME}.a
optinstall_LIB = lib/lib${MPIFWRAPNAME}.a
#optinstall_SHLIB = lib/lib${MPIFLIBNAME}.@SHLIB_EXT@
#optinstall_SHLIB = lib/lib${MPICXXLIBNAME}.@SHLIB_EXT@

# Extra information on creating shared libraries, needed on some platforms
# On the platforms that require these options, we require that 
# PMPILIBNAME and MPILIBNAME be the same.
# UNUSED, example for experimentation only
#lib${MPILIBNAME}_so_EXPORTS = maint/mpi.def
#libf${MPILIBNAME}_so_EXPORTS = maint/fmpi.def
lib${MPILIBNAME}_so_LIBS   = -L. @LDFLAGS_DEPS@ @LIB_DEPS@
libf${MPILIBNAME}_so_LIBS   = -L. @LDFLAGS_DEPS@ -l$(MPILIBNAME) @LIB_DEPS@
lib${MPILIBNAME}f90_so_LIBS = -L. @LDFLAGS_DEPS@ -l$(MPILIBNAME) @LIB_DEPS@
lib${MPICXXLIBNAME}_so_LIBS = -L. @LDFLAGS_DEPS@ -l$(MPILIBNAME) @LIB_DEPS@
# Add CXXFLAGS to the linker incase the user has used the CXXFLAGS to 
# change the architecture (e.g., -m64 to force 64-bit)
lib${MPICXXLIBNAME}_so_LINKER = @CXX_SHL@ @CXXFLAGS@

install_INCLUDE = src/include/mpi.h $(srcdir)/src/include/mpix.h

optinstall_LIB = lib/lib${PMPILIBNAME}.a
optinstall_SHLIB = lib/lib${MPILIBNAME}.@SHLIB_EXT@
optinstall_SHLIB = lib/lib${PMPILIBNAME}.@SHLIB_EXT@
optinstall_INCLUDE = src/mpi/romio/include/mpiof.h src/mpi/romio/include/mpio.h
optinstall_LIB = lib/libf${MPILIBNAME}.a
optinstall_SHLIB = lib/libf${MPILIBNAME}.@SHLIB_EXT@
optinstall_LIB = lib/lib${MPILIBNAME}f90.a
optinstall_SHLIB = lib/lib${MPILIBNAME}f90.@SHLIB_EXT@
optinstall_SHLIB = lib/lib${MPICXXLIBNAME}.@SHLIB_EXT@

# Some of the subsidiary packages may need to be installed.  This target will
# invoke their install targets as part of the installation process
INSTALL_SUBDIRS = src/env src/packaging/pkgconfig src/packaging/envmods \
                  @bindings_dirs@ @other_install_dirs@

# Install preamble checks for possible problems
install-preamble:
	@if [ "@ENABLE_SHLIB@" = none ] ; then\
             found=no ; \
	     for file in ${libdir}/lib*${MPILIBNAME}.@SHLIB_EXT@ ; do \
                 if [ -f $$file ] ; then \
		     echo "Remove $$file and rerun ${MAKE} install" ; \
		     found=yes ; \
		 fi ; \
	     done ; \
	     if [ $$found != no ] ; then exit 1 ; fi ;\
	fi

# Install optional features which require special actions:
#   The debugger interface (the "Totalview" DLL)
#   The "other" process managers when more that one are built
install_local_DIR = libdir
# 
# The variables used in the make of install-alt below must be
# the ones within the Makefile - otherwise, if those variables are
# not defined in the shell, the command-line will cause the make step 
# to attempt to install into / and the user's home directory
# (This explanation is here to explain why values in the shell must not
# be used.)
install-local:
	-if [ "@BUILD_TVDLL@" = "yes" ] ; then \
	    $(INSTALL_DATA) src/mpi/debugger/libtvmpich2.@SHLIB_EXT@ \
			${DESTDIR}${libdir}/libtvmpich2.@SHLIB_EXT@ ; fi
	-if [ -n "@other_pm_names@" ] ; then \
	    for pm in @other_pm_names@ /dev/null ; do \
		if [ -d src/pm/$$pm ] ; then \
		     (cd src/pm/$$pm && \
		$(MAKE) DESTDIR=${DESTDIR} prefix=${prefix} bindir=${bindir} install-alt ) ; \
		fi ; \
	    done ; \
	fi

# 
# The install-examples target may be used if you want to install the cpi
# program for others to use.  This is nto part of the default installation
# because there isn't a good place to put this in the GNU recommended 
# installation targets (its a kind of hardware-architecture-specific
# documentation)
install-examples:
	if [ ! -d ${DESTDIR}${exec_prefix}/examples ] ; then \
	    $(MKDIR_P) ${DESTDIR}${exec_prefix}/examples ; \
	fi
	$(INSTALL_PROGRAM) examples/cpi ${DESTDIR}${exec_prefix}/examples/cpi

install-devdocs:
	(cd doc && $(MAKE) install-devdocs)

# installcheck-postable adds checks that may require special
# handling.  
# FIXME: Some install checks require that the Process Manager be
# started first.  This step does not handle that.
installcheck-postamble:
	@if [ -n "@mpe_dir@" -a -d "src/@mpe_dir@" ] ; then \
	    (cd src/@mpe_dir@ && $(MAKE) installcheck-all PACKAGE=$(PACKAGE) ; ) ; fi
#
# The documents are shipped as part of the release, and so should be 
# installed from the source directory, not a VPATH build directory
install_DOC = 
optinstall_DOC = \
    $(srcdir)/doc/userguide/user.pdf \
    $(srcdir)/doc/installguide/install.pdf \
    $(srcdir)/doc/smpd/smpd_pmi.pdf \
    $(srcdir)/doc/logging/logging.pdf
installdir_HTML = $(srcdir)/www
installdir_MAN  = $(srcdir)/man
#install_BIN = 
#install_SBIN = 	
# Still to do: figure out the appropriate target for installing the html
# versions of the documents.
